#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t size)
    : _taskSize{size}, _stop{false}
{
}

TaskQueue::~TaskQueue()
{
}

void TaskQueue::addTask(Task *task)
{
    unique_lock<mutex> lock(_mtx);
    _full.wait(lock, [this]()
               { return !this->full(); });
    _tasks.push(task);
    _empty.notify_one();
}

Task *TaskQueue::front()
{
    unique_lock<mutex> lock(_mtx);
    _empty.wait(lock, [this]()
                { return this->_stop || !this->_tasks.empty(); });
    if (_stop && _tasks.empty())
        return nullptr;
    Task *tmp = _tasks.front();
    _tasks.pop();
    _full.notify_one();
    return tmp;
}

bool TaskQueue::full()
{
    return _tasks.size() == _taskSize;
}

void TaskQueue::wakeup()
{
    _stop = true;
    _empty.notify_all();
}